package com.rockontrol.ele.service.model.dbtransaction.impl;

import java.sql.Timestamp;
import java.util.Date;
import java.util.List;

import com.rksp.svc.BaseSvc;
import com.rksp.util.DatabaseUtil;
import com.rksp.util.StringUtil;
import com.rockontrol.ele.pojo.Ma办公用品移交明细;
import com.rockontrol.ele.pojo.Ma回收单;
import com.rockontrol.ele.pojo.Ma帐套;
import com.rockontrol.ele.pojo.Ma报废单;
import com.rockontrol.ele.pojo.Ma材料回收明细;
import com.rockontrol.ele.pojo.Ma材料报废;
import com.rockontrol.ele.pojo.Ma材料移交;
import com.rockontrol.ele.pojo.Ma材料维修;
import com.rockontrol.ele.pojo.Ma移交单;
import com.rockontrol.ele.pojo.Ma维修单;
import com.rockontrol.ele.pojo.Ma综合物品;
import com.rockontrol.ele.pojo.Ma综合物品回收明细;
import com.rockontrol.ele.pojo.Ma设备台帐;
import com.rockontrol.ele.pojo.Ma设备回收明细;
import com.rockontrol.ele.pojo.Ma设备回收鉴定;
import com.rockontrol.ele.pojo.Ma设备报废明细;
import com.rockontrol.ele.pojo.Ma设备移交明细;
import com.rockontrol.ele.service.MaOtherSvc;
import com.rockontrol.ele.service.model.dbtransaction.MaUseTrans;
import com.rockontrol.ele.vo.MaApplianceCdt;

/**
 * 增加物品种类时需要调整该服务相关接口
 */
public class MaUseTransImpl extends BaseSvc implements MaUseTrans {
    private MaOtherSvc maOtherSvc;
	
	private Ma帐套 getTheMaterialAccount (String unitId,String type){
		if(StringUtil.isEmpty(unitId)||StringUtil.isEmpty(type))
			return null;
		List<Ma帐套> list= service.findObjsHQL("from Ma帐套 a where a.单位id='"+unitId+"' and a.类型分类名='"+type+"' and a.类型='实体库'");
		return list.isEmpty()?null:list.get(0);
	}
	
	//回收服务
	public String serviceCreateMaRecover(Ma回收单 er_){
		service.addObj(er_);

		Ma帐套 in=getTheMaterialAccount(er_.get回收单位id(),er_.get回收类型());
		if(er_.getEqDetails()!=null){
			for(Ma设备回收明细 detail:er_.getEqDetails()){
				detail.set回收单id(er_.getOid());
				service.addObj(detail);

				//操作库存
				if(er_.isUpdateInventory()&&in!=null){
					service.execHQL("update Ma物资库存 a set a.库存量=a.库存量+1 where a.帐套id='"+in.getOid()+"' and a.物资分类id='"+detail.get设备分类id()+"' and a.规格型号id='"+detail.get设备型号id()+"'");
					service.execHQL("update Ma设备 a set a.设备状态='库存' where a.oid='"+detail.get设备id()+"'");
					String dataBaseType = DatabaseUtil.getDataBaseType(dataSource);
					if("SQLSERVER".equals(dataBaseType)){
					        //数据库为sqlserver时执行的操作
					    service.execHQL("update Ma设备台帐 a set a.状态='未管',a.调出时间=GETDATE() where a.设备id = '"+detail.get设备id()+"' and a.状态='在管'");
					}else if("ORACLE".equals(dataBaseType)){
					        //数据库为oracle时执行的操作
					    service.execHQL("update Ma设备台帐 a set a.状态='未管',a.调出时间=sysdate where a.设备id = '"+detail.get设备id()+"' and a.状态='在管'");
					}
				}
			}
		}
		if(er_.getMaDetails()!=null){
			for(Ma材料回收明细 detail:er_.getMaDetails()){
				detail.set回收单id(er_.getOid());
				service.addObj(detail);
				
			}
		}
		if(er_.getThDetails()!=null){
			for(Ma综合物品回收明细 detail:er_.getThDetails()){
				detail.set回收单id(er_.getOid());
				service.addObj(detail);
				
			}
		}
		return er_.getOid();
	}
	public Boolean serviceUpdateMaRecover(Ma回收单 er_){
		service.modifyObj(er_);
		service.execHQL("delete from Ma设备回收明细 a where a.回收单id='"+er_.getOid()+"'");
		service.execHQL("delete from Ma材料回收明细 a where a.回收单id='"+er_.getOid()+"'");
		service.execHQL("delete from Ma综合物品回收明细 a where a.回收单id='"+er_.getOid()+"'");
		Ma帐套 in=getTheMaterialAccount(er_.get回收单位id(),er_.get回收类型());
		if(er_.getEqDetails()!=null){
			for(Ma设备回收明细 detail:er_.getEqDetails()){
				detail.set回收单id(er_.getOid());
				service.addObj(detail);
				if(detail.getEqIdentifys()!=null){
					for(Ma设备回收鉴定 dd:detail.getEqIdentifys()){
						dd.set明细信息id(detail.getOid());
						service.addObj(dd);
					}
				}
				//操作库存
				if(er_.isUpdateInventory()&&in!=null){
					service.execHQL("update Ma物资库存 a set a.库存量=a.库存量+1 where a.帐套id='"+in.getOid()+"' and a.物资分类id='"+detail.get设备分类id()+"' and a.规格型号id='"+detail.get设备型号id()+"'");
					service.execHQL("update Ma设备 a set a.设备状态='库存' where a.oid='"+detail.get设备id()+"'");
					String dataBaseType = DatabaseUtil.getDataBaseType(dataSource);
					if("SQLSERVER".equals(dataBaseType)){
					        //数据库为sqlserver时执行的操作
					    service.execHQL("update Ma设备台帐 a set a.状态='未管',a.调出时间=GETDATE() where a.设备id = '"+detail.get设备id()+"' and a.状态='在管'");
					}else if("ORACLE".equals(dataBaseType)){
					        //数据库为oracle时执行的操作
					    service.execHQL("update Ma设备台帐 a set a.状态='未管',a.调出时间=sysdate where a.设备id = '"+detail.get设备id()+"' and a.状态='在管'");
					}
				}
			}
		}
		if(er_.getMaDetails()!=null){
			for(Ma材料回收明细 detail:er_.getMaDetails()){
				detail.set回收单id(er_.getOid());
				service.addObj(detail);
				//操作库存
				if(er_.isUpdateInventory()&&in!=null){
					service.execHQL("update Ma物资库存 a set a.库存量=a.库存量+"+detail.get回收数量()+" where a.帐套id='"+in.getOid()+"' and a.物资分类id='"+detail.get物资分类id()+"' and a.规格型号id='"+detail.get物资型号id()+"'");
				}
			}
		}
		if(er_.getThDetails()!=null){
			for(Ma综合物品回收明细 detail:er_.getThDetails()){
				detail.set回收单id(er_.getOid());
				service.addObj(detail);
				//操作库存
				if(er_.isUpdateInventory()&&in!=null){
					service.execHQL("update Ma物资库存 a set a.库存量=a.库存量+1 where a.帐套id='"+in.getOid()+"' and a.物资分类id='"+detail.get物品分类id()+"' and a.规格型号id='"+detail.get物品型号id()+"'");
				}
			}
		}
		return true;
	}
	public Boolean serviceDeleteMaRecover(String id_){
//		Ma回收单 er_=(Ma回收单) service.findObj(Ma回收单.class, id_);
		service.execHQL("delete from Ma设备回收明细 a where a.回收单id='"+id_+"'");
		service.execHQL("delete from Ma材料回收明细 a where a.回收单id='"+id_+"'");
		service.execHQL("delete from Ma综合物品回收明细 a where a.回收单id='"+id_+"'");
		service.removeObj(Ma回收单.class,id_);
		return true;
	}
	
	//移交服务
	public String serviceCreateMaTransfer(Ma移交单 et_){
		service.addObj(et_);
		if(et_.getEqList()!=null){
			Ma帐套 in=getTheMaterialAccount(et_.get调入单位id(),et_.get移交类型());
			for(Ma设备移交明细 detail:et_.getEqList()){
				detail.set移交单id(et_.getOid());
				service.addObj(detail);
				if(et_.isUpdateInventory()){
				    String dataBaseType = DatabaseUtil.getDataBaseType(dataSource);
				    if("SQLSERVER".equals(dataBaseType)){
				            //数据库为sqlserver时执行的操作
				        service.execHQL("update Ma设备台帐 a set a.状态='未管',a.调出时间=GETDATE() where a.设备id = '"+detail.get设备id()+"' and a.状态='在管'");
				    }else if("ORACLE".equals(dataBaseType)){
				            //数据库为oracle时执行的操作
				        service.execHQL("update Ma设备台帐 a set a.状态='未管',a.调出时间=sysdate where a.设备id = '"+detail.get设备id()+"' and a.状态='在管'");
				    }
					Ma设备台帐 acc=new Ma设备台帐();
					acc.set使用单位(et_.get调入单位());
					acc.set使用单位id(et_.get调入单位id());
					acc.set使用单位编码(et_.get调入单位编码());
					acc.set发放人id(et_.get调出单位经办人id());
					acc.set发放人姓名(et_.get调出单位经办人姓名());
					acc.set帐套id(in.getOid());
					acc.set状态("在管");
					acc.set设备id(detail.get设备id());
					acc.set设备分类(detail.get设备分类());
					acc.set设备名称(detail.get设备名称());
					acc.set设备型号(detail.get设备型号());
					acc.set设备编码(detail.get设备编码());
					acc.set调入时间(new Timestamp(new Date().getTime()));
					acc.set负责人id(et_.get调入单位负责人id());
					acc.set负责人姓名(et_.get调入单位负责人姓名());
					acc.set领用人id(et_.get调入单位经办人id());
					acc.set领用人姓名(et_.get调入单位经办人姓名());
					service.addObj(acc);
				}
			}
		}
		if(et_.getMaList()!=null){
			for(Ma材料移交 ma材料移交:et_.getMaList()){
				ma材料移交.set移交单id(et_.getOid());
				service.addObj(ma材料移交);
			}
		}
		if(et_.getThingList()!=null){
			for(Ma办公用品移交明细 detail:et_.getThingList()){
				detail.set移交单id(et_.getOid());
				service.addObj(detail);
			}
		}
		return et_.getOid();
	}
	public Boolean serviceUpdateMaTransfer(Ma移交单 et_){
		service.modifyObj(et_);
		service.execHQL("delete from Ma设备移交明细 a where a.移交单id='"+et_.getOid()+"'");
		service.execHQL("delete from Ma材料移交 a where a.移交单id='"+et_.getOid()+"'");
		service.execHQL("delete from Ma办公用品移交明细 a where a.移交单id='"+et_.getOid()+"'");
		if(et_.getEqList()!=null){
			Ma帐套 in=getTheMaterialAccount(et_.get调入单位id(),et_.get移交类型());
			for(Ma设备移交明细 detail:et_.getEqList()){
				detail.set移交单id(et_.getOid());
				service.addObj(detail);
				if(et_.isUpdateInventory()){
				    String dataBaseType = DatabaseUtil.getDataBaseType(dataSource);
				    if("SQLSERVER".equals(dataBaseType)){
				            //数据库为sqlserver时执行的操作
				        service.execHQL("update Ma设备台帐 a set a.状态='未管',a.调出时间=GETDATE() where a.设备id = '"+detail.get设备id()+"' and a.状态='在管'");
				    }else if("ORACLE".equals(dataBaseType)){
				            //数据库为oracle时执行的操作
				        service.execHQL("update Ma设备台帐 a set a.状态='未管',a.调出时间=sysdate where a.设备id = '"+detail.get设备id()+"' and a.状态='在管'");
				    }
					Ma设备台帐 acc=new Ma设备台帐();
                    acc.set使用单位(et_.get调入单位());
                    acc.set使用单位id(et_.get调入单位id());
                    acc.set使用单位编码(et_.get调入单位编码());
                    acc.set发放人id(et_.get调出单位经办人id());
                    acc.set发放人姓名(et_.get调出单位经办人姓名());
                    acc.set帐套id(in.getOid());
                    acc.set状态("在管");
                    acc.set设备id(detail.get设备id());
                    acc.set设备分类(detail.get设备分类());
                    acc.set设备名称(detail.get设备名称());
                    acc.set设备型号(detail.get设备型号());
                    acc.set设备编码(detail.get设备编码());
                    acc.set调入时间(new Timestamp(new Date().getTime()));
                    acc.set负责人id(et_.get调入单位负责人id());
                    acc.set负责人姓名(et_.get调入单位负责人姓名());
                    acc.set领用人id(et_.get调入单位经办人id());
                    acc.set领用人姓名(et_.get调入单位经办人姓名());
                    service.addObj(acc);
				}
			}
		}
		if(et_.getMaList()!=null){
			for(Ma材料移交 detail:et_.getMaList()){
				detail.set移交单id(et_.getOid());
				service.addObj(detail);
			}
		}
		if(et_.getThingList()!=null){
			for(Ma办公用品移交明细 detail:et_.getThingList()){
				detail.set移交单id(et_.getOid());
				service.addObj(detail);
				
				//办公用品移交后修改台账
				if(et_.isUpdateInventory()){
				    Ma帐套 in=getTheMaterialAccount(et_.get调入单位id(),et_.get移交类型());
				    String dataBaseType = DatabaseUtil.getDataBaseType(dataSource);
				    if("SQLSERVER".equals(dataBaseType)){
				            //数据库为sqlserver时执行的操作
				        service.execHQL("update Ma综合物品 a set a.状态='未管',a.调出时间=GETDATE() where a.设备id = '"+detail.get物资id()+"' and a.状态='在管'");
				    }else if("ORACLE".equals(dataBaseType)){
				            //数据库为oracle时执行的操作
				        service.execHQL("update Ma综合物品 a set a.状态='未管',a.调出时间=sysdate where a.设备id = '"+detail.get物资id()+"' and a.状态='在管'");
				    }
                    Ma综合物品 acc=new Ma综合物品();
                    acc.set使用单位(et_.get调入单位());
                    acc.set使用单位id(et_.get调入单位id());
                    acc.set使用单位编码(et_.get调入单位编码());
                    acc.set帐套id(in.getOid());
                    acc.set物品状态("在管");
                    acc.set录入时间(new Timestamp(new Date().getTime()));
                    acc.set录入人id(et_.get调入单位负责人id());
                    acc.set录入人(et_.get调入单位负责人姓名());
                    acc.set验收人id(et_.get调入单位经办人id());
                    acc.set验收人姓名(et_.get调入单位经办人姓名());
                    
                    MaApplianceCdt cdt = new MaApplianceCdt();
                    cdt.set物品编码(detail.get物资编码());
                    maOtherSvc.getApplianceThings(cdt);
                    acc.set供货商名称(maOtherSvc.getApplianceThings(cdt).get(0).get供货商名称());
                    acc.set供货商名称(maOtherSvc.getApplianceThings(cdt).get(0).get供货商id());
                    
                    service.addObj(acc);
                }
			}
		}
		return true;
	}
	public Boolean serviceDeleteMaTransfer(String id_){
		service.execHQL("delete from Ma设备移交明细 a where a.移交单id='"+id_+"'");
		service.execHQL("delete from Ma材料移交 a where a.移交单id='"+id_+"'");
		service.execHQL("delete from Ma办公用品移交明细 a where a.移交单id='"+id_+"'");
		service.removeObj(Ma移交单.class, id_);
		return true;
	}
	
	//报废服务
	public String serviceCreateMaScrap(Ma报废单 es_){
		service.addObj(es_);
		if(es_.getEqBfList()!=null){
			for(Ma设备报废明细 detail:es_.getEqBfList()){
				detail.set单据id(es_.getOid());
				service.addObj(detail);
			}
		}
		if(es_.getMaBfList()!=null){
			for(Ma材料报废 detail:es_.getMaBfList()){
				detail.set单据id(es_.getOid());
				service.addObj(detail);
			}
		}
		
		return es_.getOid();
	}
	public Boolean serviceUpdateMaScrap(Ma报废单 es_){
		service.modifyObj(es_);
		service.execHQL("delete from Ma设备报废明细 a where a.单据id='"+es_.getOid()+"'");
		service.execHQL("delete from Ma材料报废 a where a.单据id='"+es_.getOid()+"'");
		if(es_.getEqBfList()!=null){
			for(Ma设备报废明细 detail:es_.getEqBfList()){
				detail.set单据id(es_.getOid());
				service.addObj(detail);
			}
		}
		if(es_.getMaBfList()!=null){
			for(Ma材料报废 detail:es_.getMaBfList()){
				detail.set单据id(es_.getOid());
				service.addObj(detail);
			}
		}
		return true;
	}
	public Boolean serviceDeleteMaScrap(String id_){
		service.execHQL("delete from Ma设备报废明细 a where a.单据id='"+id_+"'");
		service.execHQL("delete from Ma材料报废 a where a.单据id='"+id_+"'");
		service.removeObj(Ma报废单.class,id_);
		return true;
	}

	public Boolean serviceConfirmMaScrap(String id_) {
		List<Ma设备报废明细> list=service.findObjsHQL("from Ma设备报废明细 a where a.单据id='"+id_+"'");
		if(list!=null){
			for(Ma设备报废明细 detail:list){
				service.execHQL("update Ma设备 a set a.设备状态='报废' where a.oid='"+detail.get设备id()+"'");
				String dataBaseType = DatabaseUtil.getDataBaseType(dataSource);
				if("SQLSERVER".equals(dataBaseType)){
				        //数据库为sqlserver时执行的操作.
				    service.execHQL("update Ma设备台帐 a set a.状态='未管',a.调出时间=getdate() where a.设备id = '"+detail.get设备id()+"' and a.状态='在管'");
				}else if("ORACLE".equals(dataBaseType)){
				        //数据库为oracle时执行的操作
				    service.execHQL("update Ma设备台帐 a set a.状态='未管',a.调出时间=sysdate where a.设备id = '"+detail.get设备id()+"' and a.状态='在管'");
				}
			}
		}
		return true;
	}

	public String serviceCreateMaRepair(Ma维修单 es_) {
		service.addObj(es_);
		if(es_.getClwxList()!=null){
			for(Ma材料维修 detail:es_.getClwxList()){
				detail.set维修计划id(es_.getOid());
				service.addObj(detail);
			}
		}
		return es_.getOid();
	}

	public Boolean serviceDeleteMaRepair(String id_) {
		service.removeObj(Ma维修单.class,id_);
		service.execHQL("delete from Ma材料维修 a where a.维修计划id='"+id_+"'");
		return null;
	}

	public Boolean serviceUpdateMaRepair(Ma维修单 es_) {
		service.modifyObj(es_);
		service.execHQL("delete from Ma材料维修 a where a.维修计划id='"+es_.getOid()+"'");
		if(es_.getClwxList()!=null){
			for(Ma材料维修 detail:es_.getClwxList()){
				detail.set维修计划id(es_.getOid());
				service.addObj(detail);
			}
		}
		return true;
	}
}
